題目描述:
給定一個升序排列的陣列 nums
,你需要原地刪除其中重複出現的元素,使得每個元素只出現一次,並返回移除後陣列的新長度。
不要使用額外的陣列空間,你必須在原地修改輸入陣列,並在使用 O(1)
額外空間的條件下完成。
Example :
nums = [0,0,1,1,1,2,2,3,3,4]
5, nums = [0,1,2,3,4,_,_,_,_,_]
k = 5
,其中 nums
的前五個元素分別為 0, 1, 2, 3, 4
。返回的 k
之後的元素無需考慮,因此用下劃線表示。解題思路:
當我們在題目中看到 原地(in-place)更新 array 這個關鍵字時,通常可以聯想到使用「雙指針」(Two Pointers)策略來解決問題。具體步驟如下:首先,初始化兩個指針,i
初始化為 0,j
初始化為 1,然後使用 j
來遍歷整個 array。由於題目中的陣列是已排序的(Sorted Array),每當 j
指針指向的元素與 i
指針指向的元素不同時,說明我們找到了新的不重複元素。此時,將 i
指針前移一位,並將新元素放入 i
指針的新位置。遍歷完成後,返回 i + 1
,這個值代表去重後陣列的最終長度。
var removeDuplicates = function(nums) {
if (nums.length === 0) return 0;
let i = 0;
for (let j = 1; j < nums.length; j++) {
if (nums[i] !== nums[j]) {
i++;
nums[i] = nums[j];
}
}
return i + 1;
};
時間複雜度:
O(n)
,其中n
是陣列的長度。我們需要遍歷每個元素一次。
空間複雜度:O(1)
,我們只使用了常數空間來存儲指針,沒有使用額外的存儲空間。
總結:
這道題目可以歸類為「Two Pointers」。透過快慢指針的應用,我們能夠在原地更新 array,既避免了額外空間的浪費,同時也保持了高效的時間複雜度。這種技巧不僅在 LeetCode 解題中經常出現,在日常工作中同樣具有廣泛應用場景。掌握 Two Pointers 技巧,能夠讓我們更靈活地處理各種需要同時操作多個數據位置的問題,是一個極其實用的工具。